#ifndef _M_ONLINE_H_
#define _M_ONLINE_H_
#include <unordered_map>
#include <mutex>

#include "util.hpp"

class online_manager
{
private:
    std::mutex _mutex;
    // 游戏大厅的玩家
    std::unordered_map<uint64_t, websocket_server::connection_ptr> _hall_user;
    // 游戏房间的玩家
    std::unordered_map<uint64_t, websocket_server::connection_ptr> _room_user;
public:
    // 进入游戏大厅（websocket链接建立）-> 加入大厅管理
    void enter_game_hall(uint64_t uid,websocket_server::connection_ptr connPtr)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.insert(std::make_pair(uid, connPtr));
    }

    // 进入游戏房间（websocket链接建立）-> 加入房间管理
    bool enter_game_room(uint64_t uid,websocket_server::connection_ptr connPtr)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.insert(std::make_pair(uid, connPtr));
    }

    // 退出游戏大厅（websocket链接断开）-> 移除大厅管理
    bool exit_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.erase(uid);
    }

    // 退出游戏房间（websocket链接断开）-> 移除房间管理
    bool exit_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.erase(uid);
    }

    // 判断用户在游戏大厅/房间
    bool is_in_game_hall(uint64_t uid)
    {
        return _hall_user.find(uid) != _hall_user.end();
    }
    bool is_in_game_room(uint64_t uid)
    {
        return _room_user.find(uid) != _room_user.end();
    }

    // 通过用户ID在游戏大厅/房间管理表，获取对应链接
    websocket_server::connection_ptr get_conn_from_hall(uint64_t uid)
    {
        auto it = _hall_user.find(uid);
        if(it == _hall_user.end())
        {
            DLOG("用户：%ld,未在大厅",uid);
            return  websocket_server::connection_ptr();
        }
        return  it->second;
    }

    websocket_server::connection_ptr get_conn_from_room(uint64_t uid)
    {
        auto it = _room_user.find(uid);
        if(it == _room_user.end())
        {
             DLOG("用户：%ld,未在游戏房间",uid);
            return  websocket_server::connection_ptr();
        }
        return  it->second;
    }
};
#endif